package thread6fQuitThread;

/**
 * Created with IntelliJ IDEA
 * Description:
 * User:34398
 * Date:2024-07-02
 * Time:11:17
 */


//由于需要休眠，所以在执行Interruption的时后大概率，创建的线程是在休眠的（因为主线程和创建的线程之间调用的是非常快的）
    /**
     * 同时一旦调用interrupte 那么睡眠的线程会被唤醒，之后就会抛出运行时异常*/
public class demo6 {

    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
            Thread curThread=Thread.currentThread();//这个静态方法可以获取当前线程的引用(实例)



            while(!curThread.isInterrupted()){
                System.out.println("创建的线程在运行");
                try {
                    for (int i = 0; i <10 ; i++) {
                        Thread.sleep(1000);//sleep会清除标志位
                        System.out.println("thread线程");
                    }
                } catch (InterruptedException e) {
//                    e.printStackTrace();
                    System.out.println("捕获到异常");
//                    break;//如果确实需要终止，那么加上一个break;
                    curThread.interrupt();
                    /**所以一个线程接收到interrupted后不是被强制中断，而是自行判断如何对其进行处理
                     *
                     *interrupt==flase会进入catch语句（InterruptedException e）
                     * 也就是说，A线程告诉B线程，你要结束，B线程可以选择不结束（sleep醒了，把标志置位设置达成true）
                     * 也可以选择结束（添加break代码 或者return）*/
                }

            }

        });

        //正常情况下，如果先start那么之后调用interrupt函数，然后唤醒sleep的线程，然后抛出异常，但是创建的
        //线程仍然会执行，原因是sleep会情况之前的interrupt

        thread.start();
        Thread.sleep(3000);//主线程先休眠，确保子线程有机会运行
        thread.interrupt();/**这个方法不仅可以设置标志位，还可以唤醒sleep*/


    }
}
